package exam;

/**
 * <img src="./img/6.png" alt="题目"/>
 * Ipv4
 * 地址格式：127.0.0.1
 * <p>
 * Ipv6
 * 地址格式：2001:c0a8:82e7:0:0:0:c0e8:82e7
 * IPv6采用128位地址长度
 * 解决了地址短缺问题，考虑了在IPv4中解决不好的其它问题，主要有端到端IP连接、服务质量（QoS）、安全性、多播、移动性、即插即用等。
 * 冒分十六进制表示法：
 * 格式为X:X:X:X:X:X:X:X，其中每个X表示地址中的16b，以十六进制表示，例如：
 * ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
 * 这种表示法中，每个X的前导0是可以省略的，例如：
 * 2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A
 */
public class IP地址 {

    public static void main(String[] args) {
//        InetAddressValidator validator = InetAddressValidator.getInstance();
//        System.out.println(validator.isValidInet4Address("192.16.8.1"));
//        System.out.println(validator.isValidInet6Address("AD80:0000:0000:0000:ABAA:0000:00C2:0002"));
        IP地址 instance = new IP地址();
        System.out.println(instance.judgeIp("192.16.8.1"));
        System.out.println(instance.judgeIp("ABCD:EF01:2345:6789:ABCD:EF01:2345:6789"));

//        Scanner scanner = new Scanner(System.in);
//        String IP = scanner.nextLine();
//        System.out.println(instance.judgeIp(IP));
    }

    /**
     * ipv4  包含.,分隔时需要转义
     * ipv6  包含:
     *
     * @param ip
     * @return
     */
    private String judgeIp(String ip) {
        if (ip.contains(".")) {
            String[] ipv4 = ip.split("\\.");
            if (ipv4.length == 4 && judgeIpv4(ipv4)) {
                return "IPv4";
            }
        } else if (ip.contains(":")) {
            String[] ipv6 = ip.split(":");
            if (ipv6.length == 8 && judgeIpv6(ipv6)) {
                return "IPv6";
            }
        }
        return "Neither";
    }

    /**
     * 分隔 长度为4
     * 每位 长度1~3  长度>1时 第一位不能为0
     * 每个 正则匹配 [0-9]*  数字不能大于255
     *
     * @param ipv4
     * @return
     */
    private boolean judgeIpv4(String[] ipv4) {
        for (int i = 0; i < ipv4.length; i++) {
            char[] num = ipv4[i].toCharArray();
            int length = num.length;
            if (length == 0 || length > 3 || length > 1 && num[0] == '0') {
                return false;
            }
            for (char c : num) {
                boolean digit = Character.isDigit(c);
                if (!digit) {
                    return false;
                }
            }
            int numTemp = Integer.parseInt(ipv4[i]);
            if (numTemp < 0 || numTemp > 255) {
                return false;
            }
        }
        return true;
    }

    /**
     * 分隔 长度为8
     * 每位 长度1~4
     * 每个 正则匹配  [0-9A-F]*
     * ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
     *
     * @param ipv6
     * @return
     */
    private boolean judgeIpv6(String[] ipv6) {
        for (int i = 0; i < ipv6.length; i++) {
            String num = ipv6[i].toUpperCase();//Locale.ROOT
            int length = num.length();
            if (length == 0 || length > 4) {
                return false;
            }
            char[] arr = ipv6[i].toCharArray();
            for (int j = 0; j < arr.length; j++) {
                if ((arr[j] < '0' && arr[j] > '9') || (arr[j] < 'A' && arr[j] > 'F') || (arr[j] < 'a' && arr[j] > 'f')) {
                    return false;
                }
            }
        }
        return true;
    }
    /*Pattern pattern = Pattern.compile("[0-9A-F]*");
    if (!pattern.matcher(num).matches()) {
        return false;
    }*/
}
